/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.bld.model.acessos;

import br.com.bld.util.facade.AbstractBe;
import br.com.bld.util.facade.BLDDataErro;
import br.com.bld.util.facade.EntityFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;

/**
 *
 * @author Pedro
 */
public class AcessosBe extends AbstractBe implements BLDDataErro {

    private final AcessosDao dao;

    public AcessosBe() throws SQLException {
        super();

        dao = createDao();
    }

    public AcessosBe(Connection conn) throws SQLException {
        super(conn);

        dao = createDao();
    }

    private AcessosDao createDao() {

        String table = "bldtb10_acessos";

        String[] fields = {
            "periodo",
            "bldtb09_id",
            "qtde_acesso"
        };

        String[] pk = {"periodo", "bldtb09_id"};

        return new AcessosDao(conn, new EntityFactory(conn, table, fields, pk));
    }

    public int inserir(AcessosEntity entity, Long anuncioId) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AcessosEntity.CLASS_ID));
        }

        int resposta = dao.insert(entity, new AcessosPK(proximoId(), anuncioId));

        commit();

        return resposta;
    }

    public AcessosEntity selecionar(AcessosPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AcessosPK.CLASS_ID));
        }

        return dao.selectByPk(pk);
    }

    public int atualizar(AcessosEntity entity, AcessosPK pk) throws SQLException {

        if (entity == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AcessosEntity.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.update(entity, pk);

        commit();

        return resposta;
    }

    public int apagar(AcessosPK pk) throws SQLException {

        if (pk == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, AcessosPK.CLASS_ID));
        }

        if (selecionar(pk) == null) {
            throw new IllegalArgumentException(REGT_NAO_LOCALIZADO);
        }

        int resposta = dao.delete(pk);

        commit();

        return resposta;
    }

    public HashMap<AcessosPK, AcessosEntity> selecionarTodos() throws SQLException {
        return dao.selectAll();
    }

    public HashMap<AcessosPK, AcessosEntity> selecionarPaginacao(Integer numrPagina, Integer qtdePorPagina) throws SQLException {

        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Número da Página"));
        }
        if (numrPagina == null) {
            throw new IllegalArgumentException(String.format(PARM_NAO_INFORMADO, "Quantidade por Página"));
        }

        return dao.selectByPage(numrPagina, qtdePorPagina);
    }

    private Long proximoId() throws SQLException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");

        return Long.parseLong(sdf.format(new Date()));
    }
}
